package offer2

/*
*
原题链接:
https://leetcode.cn/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/

从上到下按层打印二叉树，同一层的节点按从左到右的顺序打印，每一层打印到一行。

例如:
给定二叉树: [3,9,20,null,null,15,7]

		3
	   / \
	  9  20
		/  \
	   15   7

返回其层次遍历结果：
[

	[3],
	[9,20],
	[15,7]

]
*/
func levelOrder2(root *TreeNode) [][]int {

	var res [][]int //创建二维数组
	if root == nil {
		return nil
	} //根节点为nil, 返回nil即可

	var queue []*TreeNode       //声明节点队列
	queue = append(queue, root) //节点入队列

	for len(queue) > 0 { //只要队列中还有节点, 持续循环
		n := len(queue) //当前层的节点数
		var path []int  //当前层的切片

		for i := 0; i < n; i++ { //遍历n次
			node := queue[0]  //获取头部元素
			queue = queue[1:] //队列头部元素出队列

			path = append(path, node.Val) //将当前值添加到当前层的切片数组

			if node.Left != nil { //当前节点的左右节点入队列
				queue = append(queue, node.Left)
			}
			if node.Right != nil {
				queue = append(queue, node.Right)
			}
		}

		//将当前层的path切片复制到结果二维数组中
		tmp := make([]int, len(path))
		copy(tmp, path)
		res = append(res, tmp)

	}
	return res
}
